#!/usr/bin/python
# -*- coding: utf-8 -*-
import sklearn
import tensorflow as tf
import numpy as np
from sklearn.datasets import load_iris
# pip install scikit-learn -i https://pypi.doubanio.com/simple

"""
tensorflow高阶API使用实例，将搭建一个三层的人工神经网络，用于特征分类。
鸢尾花分类包含三个数据集，每个数据集各50张图片且为同一花目，需要通过“花萼长度、花萼宽度、花瓣长度及花瓣宽度”四个方向进行分析。
该实例属于多重变量分析的场景。
numpy库用于数值计算，sklearn库用于提供数据集。
"""

'''
One-Hot编码
from sklearn.preprocessing import OneHotEncoder
import  numpy as np
y=np.array([0,1,2,3,1,2,0,1])
ohe = OneHotEncoder()
ohe.fit([[0],[1],[2],[3]])
print(ohe.transform(y.reshape(-1,1)).toarray())

我们会看到输出结果为
[[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [1. 0. 0. 0.]
 [0. 1. 0. 0.]]
'''

if __name__ == '__main__':
    data = load_iris()  # 读取数据集
    iris_data = np.float32(data.data)  # 获取数据集中鸢尾花的四个属性
    iris_target = data.target  # 获取鸢尾花的类别
    iris_target = tf.keras.utils.to_categorical(iris_target, num_classes=3)  # 标签转为one-hot标签
    train_data = tf.data.Dataset.from_tensor_slices((iris_data, iris_target)).batch(128)  # 批量加载数据
    inputs = tf.keras.layers.Input(shape=(4))
    x = tf.keras.layers.Dense(32,activation='relu')(inputs)
    x = tf.keras.layers.Dense(64,activation='relu')(x)
    outputs = tf.keras.layers.Dense(3,activation='softmax')(x)
    model = tf.keras.Model(inputs = inputs, outputs = outputs)
    model.compile(
        optimizer=tf.optimizers.Adam(lr=1e-3),
        loss=tf.losses.categorical_crossentropy,
        metrics=['accuracy']
    )
    model.fit(train_data, epochs=500)
    score = model.evaluate(iris_data, iris_target)
    print('last_score', score)